<?php

class Controller_Cli {

	/**
	 * execute
	 * 执行
	 *
	 * @return void
	 */
	public function execute() {

		// 获取参数列表
		$options = self::parseParameters();

		// 类名称
		$className = $options['n'];

		// 类名为空
		if (!$className) {
			throw new Yaf_Exception("To run a command, type 'php app_demo/backend/command.php -n className [args]'");
		}

		// 类不存在
		if (!class_exists($className)) {
			throw new Yaf_Exception('class ' . $className . ' is not exists');
		}

		// 实例化
		$object = new $className($options);

		// 默认方法
		$methodName = 'main';

		// 方法是否存在
		if (!method_exists($object, $methodName)) {
			throw new Yaf_Exception($className . '::' . $methodName . ' is not exists');
		}

		// 执行
		Yaf_Application::app()->execute(array($object, $methodName));
	}

	/**
	 * parseParameters
	 * 分析从命令行传入的参数
	 *
	 * 支持的类型：
	 * -e
	 * -e <value>
	 * --long-param
	 * --long-param=<value>
	 * --long-param <value>
	 * <value>
	 *
	 * @return array
	 */
	public static function parseParameters() {

		$result = array();
		$params = $GLOBALS['argv'];

		reset($params);

		while (list($tmp, $p) = self::_each($params)) {
			if (substr($p, 0, 1) == '-') {
				$pname = substr($p, 1);
				$value = true;

				if (substr($pname, 0, 1) == '-') {

					// long-opt (--<param>)
					$pname = substr($pname, 1);

					// 使用'='链接的long-opt: --<param>=<value>
					if (strpos($p, '=') !== false) {
						list($pname, $value) = explode('=', substr($p, 2), 2);
					}
				}

				// 下一个参数
				$nextParm = current($params);
				if ($value === true && $nextParm !== false && substr($nextParm, 0, 1) != '-') {
					list($tmp, $value) = self::_each($params);
				}

				$result[$pname] = $value;
			} else {
				// 不以'-'或'--'开头的opt
				$result[] = $p;
			}
		}

		return $result;
	}

	private static function _each(&$array) {
		$res = array();
		$key = key($array);
		if ($key !== null) {
			next($array);
			$res[1] = $res['value'] = $array[$key];
			$res[0] = $res['key'] = $key;
		} else {
			$res = false;
		}
		return $res;
	}
}
